package 单调栈;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/3/11 15:56
 */
public class leetcode20有效的括号 {
    /*
     不要被 一些 现有的思想 所束缚
     */





    public boolean solutionNew(String s){
        Deque<Character> stack = new ArrayDeque<>();
        for(char ch : s.toCharArray()){
            if(ch == '(' || ch == '[' || ch == '{'){
                stack.addLast(ch);
            }
            else if(stack.isEmpty()){
                return false;
            }
            else if(ch == ')'){
                if('(' == stack.peekLast()){
                    stack.removeLast();
                }
                else{
                    return false;
                }
            }
            else if(ch == ']'){
                if('[' == stack.peekLast()){
                    stack.removeLast();
                }
                else{
                    return false;
                }
            }
            else if(ch == '}'){
                if('{' == stack.peekLast()){
                    stack.removeLast();
                }
                else{
                    return false;
                }
            }

        }

        return stack.isEmpty();
    }







    /*
     666;
      "([)]"  这个 case 过不了， 说明了什么， 说明必须严格的匹配！

     */
    public boolean solution(String s){
        int map[] = new int[3]; // 012 ,分别代表 （ 【 {
        boolean flag = true;
        for(char ch : s.toCharArray()){
            if(ch == '('){
                map[0]++;
            }
            else if(ch == '['){
                map[1]++;
            }
            else if(ch == '{'){
                map[2]++;
            }
            else if(ch == ')'){
                if(map[0] < 1){
                    flag = false;
                }
                map[0]--;
            }
            else if(ch == ']'){
                if(map[1] < 1){
                    flag = false;
                }
                map[1]--;
            }
            else if(ch == '}'){
                if(map[2] < 1){
                    flag = false;
                }
                map[2]--;
            }
        }

        return flag && map[0] == 0 && map[1] ==0 && map[2] == 0;

    }
}
